/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: EventTrace.java,v 1.1 2006/05/06 09:00:31 ckaestne Exp $
*/
package com.sleepycat.je.utilint;
/**
* Internal class used for transient event tracing. Subclass this with
* specific events. Subclasses should have toString methods for display and
* events should be added by calling EventTrace.addEvent();
*/
public class EventTrace {
static private int MAX_EVENTS = 100;
static public final boolean TRACE_EVENTS = false;
static int currentEvent = 0;
static final EventTrace[] events = new EventTrace[MAX_EVENTS];
static final int[] threadIdHashes = new int[MAX_EVENTS];
static boolean disableEvents = false;
protected String comment;
public EventTrace(String comment) {
this.comment = comment;
}
public EventTrace() {
comment = null;
}
public String toString() {
return comment;
}
static public void addEvent(EventTrace event) {
if (disableEvents) {
return;
}
int nextEventIdx = currentEvent++ % MAX_EVENTS;
events[nextEventIdx] = event;
threadIdHashes[nextEventIdx] =
System.identityHashCode(Thread.currentThread());
}
static public void addEvent(String comment) {
if (disableEvents) {
return;
}
addEvent(new EventTrace(comment));
}
static public void dumpEvents() {
if (disableEvents) {
return;
}
System.out.println("----- Event Dump -----");
EventTrace[] oldEvents = events;
int[] oldThreadIdHashes = threadIdHashes;
disableEvents = true;
int j = 0;
for (int i = currentEvent; j < MAX_EVENTS; i++) {
EventTrace ev = oldEvents[i % MAX_EVENTS];
if (ev != null) {
int thisEventIdx = i % MAX_EVENTS;
System.out.print(oldThreadIdHashes[thisEventIdx] + " ");
System.out.println(j + "(" + thisEventIdx + "): " + ev);
}
j++;
}
}
static public class ExceptionEventTrace extends EventTrace {
private Exception event;
public ExceptionEventTrace() {
event = new Exception();
}
public String toString() {
return Tracer.getStackTrace(event);
}
}
}
/*
static public class EvictEvent extends EventTrace {
long nodeId;
int addr;
public EvictEvent(String comment, long nodeId, int addr) {
super(comment);
this.nodeId = nodeId;
this.addr = addr;
}
static public void addEvent(String comment, IN node) {
long nodeId = node.getNodeId();
int addr = System.identityHashCode(node);
EventTrace.addEvent(new EvictEvent(comment, nodeId, addr));
}
public String toString() {
StringBuffer sb = new StringBuffer(comment);
sb.append(" IN: ").append(nodeId);
sb.append(" sIH ").append(addr);
return sb.toString();
}
}
static public class CursorTrace extends EventTrace {
long nodeId;
int index;
public CursorTrace(String comment, long nodeId, int index) {
super(comment);
this.nodeId = nodeId;
this.index = index;
}
static public void addEvent(String comment, CursorImpl cursor) {
long nodeId =
(cursor.getBIN() == null) ? -1 : cursor.getBIN().getNodeId();
EventTrace.addEvent
(new CursorTrace(comment, nodeId, cursor.getIndex()));
}
public String toString() {
StringBuffer sb = new StringBuffer(comment);
sb.append(" BIN: ").append(nodeId);
sb.append(" idx: ").append(index);
return sb.toString();
}
}
*/
/*
class CursorEventTrace extends EventTrace {
private String comment;
private Node node1;
private Node node2;
CursorEventTrace(String comment, Node node1, Node node2) {
this.comment = comment;
this.node1 = node1;
this.node2 = node2;
}
public String toString() {
StringBuffer sb = new StringBuffer(comment);
if (node1 != null) {
sb.append(" ");
sb.append(node1.getNodeId());
}
if (node2 != null) {
sb.append(" ");
sb.append(node2.getNodeId());
}
return sb.toString();
}
}
*/
/*
static class UndoEventTrace extends EventTrace {
private String comment;
private boolean success;
private Node node;
private DbLsn logLsn;
private Node parent;
private boolean found;
private boolean replaced;
private boolean inserted;
private DbLsn replacedLsn;
private DbLsn abortLsn;
private int index;
UndoEventTrace(String comment) {
this.comment = comment;
}
UndoEventTrace(boolean success,
Node node,
DbLsn logLsn,
Node parent,
boolean found,
boolean replaced,
boolean inserted,
DbLsn replacedLsn,
DbLsn abortLsn,
int index) {
this.comment = null;
this.success = success;
this.node = node;
this.logLsn = logLsn;
this.parent = parent;
this.found = found;
this.replaced = replaced;
this.inserted = inserted;
this.replacedLsn = replacedLsn;
this.abortLsn = abortLsn;
this.index = index;
}
public String toString() {
if (comment != null) {
return comment;
}
StringBuffer sb = new StringBuffer();
sb.append(" success=").append(success);
sb.append(" node=");
sb.append(node.getNodeId());
sb.append(" logLsn=");
sb.append(logLsn.getNoFormatString());
if (parent != null) {
sb.append(" parent=").append(parent.getNodeId());
}
sb.append(" found=");
sb.append(found);
sb.append(" replaced=");
sb.append(replaced);
sb.append(" inserted=");
sb.append(inserted);
if (replacedLsn != null) {
sb.append(" replacedLsn=");
sb.append(replacedLsn.getNoFormatString());
}
if (abortLsn != null) {
sb.append(" abortLsn=");
sb.append(abortLsn.getNoFormatString());
}
sb.append(" index=").append(index);
return sb.toString();
}
}
*/
/*
class CursorAdjustEventTrace extends EventTrace {
private int insertIndex;
private int cursorIndex;
private long nodeid;
CursorAdjustEventTrace(int insertIndex, int cursorIndex) {
this.insertIndex = insertIndex;
this.cursorIndex = cursorIndex;
this.nodeid = getNodeId();
}
public String toString() {
StringBuffer sb = new StringBuffer("cursor adjust ");
sb.append(insertIndex).append(" ");
sb.append(cursorIndex).append(" ");
sb.append(nodeid);
return sb.toString();
}
}
*/
/*
class CompressEventTrace extends EventTrace {
private int entryIndex;
private long nodeid;
CompressEventTrace(int entryIndex) {
this.entryIndex = entryIndex;
this.nodeid = getNodeId();
}
public String toString() {
StringBuffer sb = new StringBuffer("bin compress ");
sb.append(entryIndex).append(" ");
sb.append(nodeid);
return sb.toString();
}
}
*/
/*
class TreeEventTrace extends EventTrace {
private String comment;
private Node node1;
private Node node2;
TreeEventTrace(String comment, Node node1, Node node2) {
this.comment = comment;
this.node1 = node1;
this.node2 = node2;
}
public String toString() {
StringBuffer sb = new StringBuffer(comment);
if (node1 != null) {
sb.append(" ");
sb.append(node1.getNodeId());
}
if (node2 != null) {
sb.append(" ");
sb.append(node2.getNodeId());
}
return sb.toString();
}
}
*/